<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>46.3. Validator Chains</title>
<link rel="stylesheet" href="dbstyle.css" type="text/css">
<meta name="generator" content="DocBook XSL Stylesheets V1.72.0">
<link rel="start" href="index.html" title="Programmer's Reference Guide">
<link rel="up" href="zend.validate.html" title="Chapter 46. Zend_Validate">
<link rel="prev" href="zend.validate.set.html" title="46.2. Standard Validation Classes">
<link rel="next" href="zend.validate.writing_validators.html" title="46.4. Writing Validators">
<link rel="chapter" href="introduction.html" title="Chapter 1. Introduction to Zend Framework">
<link rel="chapter" href="zend.acl.html" title="Chapter 2. Zend_Acl">
<link rel="chapter" href="zend.auth.html" title="Chapter 3. Zend_Auth">
<link rel="chapter" href="zend.cache.html" title="Chapter 4. Zend_Cache">
<link rel="chapter" href="zend.config.html" title="Chapter 5. Zend_Config">
<link rel="chapter" href="zend.console.getopt.html" title="Chapter 6. Zend_Console_Getopt">
<link rel="chapter" href="zend.controller.html" title="Chapter 7. Zend_Controller">
<link rel="chapter" href="zend.currency.html" title="Chapter 8. Zend_Currency">
<link rel="chapter" href="zend.date.html" title="Chapter 9. Zend_Date">
<link rel="chapter" href="zend.db.html" title="Chapter 10. Zend_Db">
<link rel="chapter" href="zend.debug.html" title="Chapter 11. Zend_Debug">
<link rel="chapter" href="zend.dojo.html" title="Chapter 12. Zend_Dojo">
<link rel="chapter" href="zend.dom.html" title="Chapter 13. Zend_Dom">
<link rel="chapter" href="zend.exception.html" title="Chapter 14. Zend_Exception">
<link rel="chapter" href="zend.feed.html" title="Chapter 15. Zend_Feed">
<link rel="chapter" href="zend.filter.html" title="Chapter 16. Zend_Filter">
<link rel="chapter" href="zend.form.html" title="Chapter 17. Zend_Form">
<link rel="chapter" href="zend.gdata.html" title="Chapter 18. Zend_Gdata">
<link rel="chapter" href="zend.http.html" title="Chapter 19. Zend_Http">
<link rel="chapter" href="zend.infocard.html" title="Chapter 20. Zend_InfoCard">
<link rel="chapter" href="zend.json.html" title="Chapter 21. Zend_Json">
<link rel="chapter" href="zend.layout.html" title="Chapter 22. Zend_Layout">
<link rel="chapter" href="zend.ldap.html" title="Chapter 23. Zend_Ldap">
<link rel="chapter" href="zend.loader.html" title="Chapter 24. Zend_Loader">
<link rel="chapter" href="zend.locale.html" title="Chapter 25. Zend_Locale">
<link rel="chapter" href="zend.log.html" title="Chapter 26. Zend_Log">
<link rel="chapter" href="zend.mail.html" title="Chapter 27. Zend_Mail">
<link rel="chapter" href="zend.measure.html" title="Chapter 28. Zend_Measure">
<link rel="chapter" href="zend.memory.html" title="Chapter 29. Zend_Memory">
<link rel="chapter" href="zend.mime.html" title="Chapter 30. Zend_Mime">
<link rel="chapter" href="zend.openid.html" title="Chapter 31. Zend_OpenId">
<link rel="chapter" href="zend.paginator.html" title="Chapter 32. Zend_Paginator">
<link rel="chapter" href="zend.pdf.html" title="Chapter 33. Zend_Pdf">
<link rel="chapter" href="zend.registry.html" title="Chapter 34. Zend_Registry">
<link rel="chapter" href="zend.rest.html" title="Chapter 35. Zend_Rest">
<link rel="chapter" href="zend.search.lucene.html" title="Chapter 36. Zend_Search_Lucene">
<link rel="chapter" href="zend.server.html" title="Chapter 37. Zend_Server">
<link rel="chapter" href="zend.service.html" title="Chapter 38. Zend_Service">
<link rel="chapter" href="zend.session.html" title="Chapter 39. Zend_Session">
<link rel="chapter" href="zend.soap.html" title="Chapter 40. Zend_Soap">
<link rel="chapter" href="zend.test.html" title="Chapter 41. Zend_Test">
<link rel="chapter" href="zend.text.html" title="Chapter 42. Zend_Text">
<link rel="chapter" href="zend.timesync.html" title="Chapter 43. Zend_TimeSync">
<link rel="chapter" href="zend.translate.html" title="Chapter 44. Zend_Translate">
<link rel="chapter" href="zend.uri.html" title="Chapter 45. Zend_Uri">
<link rel="chapter" href="zend.validate.html" title="Chapter 46. Zend_Validate">
<link rel="chapter" href="zend.version.html" title="Chapter 47. Zend_Version">
<link rel="chapter" href="zend.view.html" title="Chapter 48. Zend_View">
<link rel="chapter" href="zend.xmlrpc.html" title="Chapter 49. Zend_XmlRpc">
<link rel="appendix" href="requirements.html" title="Appendix A. Zend Framework Requirements">
<link rel="appendix" href="coding-standard.html" title="Appendix B. Zend Framework Coding Standard for PHP">
<link rel="appendix" href="copyrights.html" title="Appendix C. Copyright Information">
<link rel="index" href="the.index.html" title="Index">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
<div class="navheader"><table width="100%" summary="Navigation header">
<tr><th colspan="3" align="center">46.3. Validator Chains</th></tr>
<tr>
<td width="20%" align="left">
<a accesskey="p" href="zend.validate.set.html">Prev</a> </td>
<th width="60%" align="center">Chapter 46. Zend_Validate</th>
<td width="20%" align="right"> <a accesskey="n" href="zend.validate.writing_validators.html">Next</a>
</td>
</tr>
</table></div>
<div class="sect1" lang="en">
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
<a name="zend.validate.validator_chains"></a>46.3. Validator Chains</h2></div></div></div>
<p>
        Often multiple validations should be applied to some value in a particular order. The following code
        demonstrates a way to solve the example from the
        <a href="zend.validate.html#zend.validate.introduction" title="46.1. Introduction">introduction</a>, where a username must be between 6 and
        12 alphanumeric characters:

        </p>
<pre class="programlisting">&lt;?php
// Provides validator chaining capability
require_once 'Zend/Validate.php';

// Validators needed for the example
require_once 'Zend/Validate/StringLength.php';
require_once 'Zend/Validate/Alnum.php';

// Create a validator chain and add validators to it
$validatorChain = new Zend_Validate();
$validatorChain-&gt;addValidator(new Zend_Validate_StringLength(6, 12))
               -&gt;addValidator(new Zend_Validate_Alnum());

// Validate the username
if ($validatorChain-&gt;isValid($username)) {
    // username passed validation
} else {
    // username failed validation; print reasons
    foreach ($validatorChain-&gt;getMessages() as $message) {
        echo "$message\n";
    }
}
        </pre>
<p>

        Validators are run in the order they were added to <code class="code">Zend_Validate</code>. In the above example,
        the username is first checked to ensure that its length is between 6 and 12 characters, and then it is
        checked to ensure that it contains only alphanumeric characters. The second validation, for
        alphanumeric characters, is performed regardless of whether the first validation, for length between 6
        and 12 characters, succeeds. This means that if both validations fail, <code class="code">getMessages()</code> will
        return failure messages from both validators.
    </p>
<p>
        In some cases it makes sense to have a validator break the chain if its validation process
        fails. <code class="code">Zend_Validate</code> supports such use cases with the second parameter to the
        <code class="code">addValidator()</code> method. By setting <code class="code">$breakChainOnFailure</code> to <code class="code">true</code>,
        the added validator will break the chain execution upon failure, which avoids running any other
        validations that are determined to be unnecessary or inappropriate for the situation. If the above
        example were written as follows, then the alphanumeric validation would not occur if the string length
        validation fails:

        </p>
<pre class="programlisting">&lt;?php
$validatorChain-&gt;addValidator(new Zend_Validate_StringLength(6, 12), true)
        -&gt;addValidator(new Zend_Validate_Alnum());
        </pre>
<p>

    </p>
<p>
        Any object that implements <code class="code">Zend_Validate_Interface</code> may be used in a validator chain.
    </p>
</div>
<div class="navfooter"><table width="100%" summary="Navigation footer">
<tr>
<td width="40%" align="left">
<a accesskey="p" href="zend.validate.set.html">Prev</a> </td>
<td width="20%" align="center"><a accesskey="u" href="zend.validate.html">Up</a></td>
<td width="40%" align="right"> <a accesskey="n" href="zend.validate.writing_validators.html">Next</a>
</td>
</tr>
<tr>
<td width="40%" align="left" valign="top">46.2. Standard Validation Classes </td>
<td width="20%" align="center"><a accesskey="h" href="index.html">Home</a></td>
<td width="40%" align="right" valign="top"> 46.4. Writing Validators</td>
</tr>
</table></div>
<div class="revinfo"></div>
</body>
</html>
